#ifndef BOX_CREATOR_REGISTRATOR_H_JM_20120702
#define BOX_CREATOR_REGISTRATOR_H_JM_20120702
/**
 * @file BoxCreatorRegistrator.h
 * Register tvorcov boxov pre runtime.
 **/

// ## C++
#include <map>

namespace jm4bbx {
	
	// Rozhranie, ktore musia tvorcovia boxov implementovat. Include az v cpp.
	class BoxModelCreator;

	/**
	 * Registrator tvorcov boxov pre runtime. Jedna sa o singelton, na ktory si 
	 * siaha priamo runtime pri vytvarani boxov podla modelu vypoctu. 
	 * Registrator umoznuje zaregistrovanie tvorcov boxov (tvorca implementuje 
	 * rozhranie {@link jm4bbx::BoxModelCreator}). Tato registracia musi 
	 * prebehnut pred spustenim runtime preroze inak nebudu tvorcovia 
	 * k dispozicii. Preto je vhodne registrovat boxy co najskor. 
	 * Automaticku registraciu poskytuju nastroje z 
	 * {@link AutomaticBoxCreatorRegistration.h}.
	 * **/
	class BoxCreatorRegistrator {
	public:

		/**
		 * Zaregistruje tvorcu pod zadanym id. Id pod ktorym je tvorca 
		 * registrovany musi zodpovedat id boxu, ktore sa pouziva v textovom  
		 * modele vypoctu.
		 * @param boxId id boxu pre ktore bude pouzity prislusny tvorca  
		 * @param creator tvorca boxu
		 **/
		void registerCreator(const std::string& boxId, 
			BoxModelCreator* creator);

		/**
		 * Vrati tvorcu pre zadane id.
		 * @param boxId id boxu v txt modele pre ktory je pozadovany tvorca
		 **/
		BoxModelCreator* getCreator(const std::string& boxId);

		/**
		 * register tvorcov je singleton a tato fcia je jediny pristupovy bod.
 		 **/
		static BoxCreatorRegistrator* getInstance();

		inline bool isRegistered(const std::string& boxId) const {
			return creators_.find(boxId) != creators_.end();
		}
	private:
		/**
		 * Ulozisko tvorcov boxov - dvojice (id,tvorca).
 		 **/
		std::map<std::string, BoxModelCreator*> creators_;

		// Znedostupnenie okoliu.
		BoxCreatorRegistrator() { };
		virtual ~BoxCreatorRegistrator() { };
		BoxCreatorRegistrator(const BoxCreatorRegistrator&);
		BoxCreatorRegistrator& operator=(const BoxCreatorRegistrator&);
	};

	
}

#endif
